/*
 * @lc app=leetcode.cn id=2 lang=cpp
 *
 * [2] 两数相加
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head = nullptr, *tail = nullptr;
        int carry = 0; // 进位
        while(l1 || l2)
        {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            carry = (n1 + n2 + carry) / 10;
            if(!head)
            {
                head = tail = new ListNode(sum % 10);
            }else
            {
                tail -> next = new ListNode(sum % 10);
                tail = tail->next; 
            }

            if(l1)
            {
                l1 = l1 -> next;
            }
            if(l2)
            {
                l2 = l2->next;
            }
        }
        if(carry)
        {
            tail -> next = new ListNode(carry);
            tail = tail -> next;
        }

        return head;
    }
};
// @lc code=end

